#pragma once
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <stdbool.h>

#define WALL L'□'
#define BODY L'※'
#define FOOD L'★'
#define POS_X 12
#define POS_Y 5
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK)&0x1) ? 1 : 0)

//蛇节点
typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode,* pSnakeNode;

//蛇的移动方向
typedef enum Direction
{
	UP,//向上走
	DOWN,//向下走
	LEFT,//向左走
	RIGHT//向右走
}Direction;

//蛇的状态
typedef enum CurrentState
{
	OK,//正常运行
	KILL_BY_WALL,//撞墙
	kILL_BY_SELF,//撞到自己
	EXIT_NORMAL//正常退出
}CurrentState;

//贪吃蛇
typedef struct Snake
{
	pSnakeNode _pSnake;//蛇头
	pSnakeNode _pFood;//食物
	Direction _dir;//蛇的移动方向
	CurrentState _curstate;//蛇的当前状态
	int _score;//总分
	int _foodwelth;//食物分数
	int _sleep;//蛇每走一步的休眠时间
}Snake,* pSnake;

//游戏初始化
void GameInit(pSnake ps);

//设置光标位置
void GetPos(short x, short y);

//打印欢迎界面
void welcome();

//创建地图
void CreateMap();

//游戏运行
void GameRun(pSnake ps);

//蛇的移动
void SnakeMove(pSnake ps);

//下一个位置是不是食物
int IsFood(pSnake ps, pSnakeNode node);

//吃食物
void EatFood(pSnake ps, pSnakeNode node);

//不是食物
void NOFood(pSnake ps, pSnakeNode node);

//撞墙
void KillByWall(pSnake ps);

//撞自己
void KillBySelf(pSnake ps);

//游戏结束
//善后工作
void Gameover(pSnake ps);

//释放节点
void ReleaseNode(ps);